﻿package
{
	import flash.display.Sprite;
	import flash.text.TextField;
	import flash.display.Bitmap;
	import flash.display.BitmapData;
	import flash.geom.Rectangle;
	import flash.geom.Matrix;
	
	public class TextSplitter
	{
		//VARIABLES INTERNAS.
		private var targetTextField_tf:TextField;
		private var parentContainer_spr:Sprite;
		private var drawRegions_bool:Boolean = false;
		private var contentColor_uint:uint = 0xFFFFFFFF;
		
		//CONSTRUCTOR.
		public function TextSplitter() 
		{
			
		}
		
		//SETTERS Y GETTERS.
		public function set targetTextField(value:TextField):void
		{
			targetTextField_tf = value;
			parentContainer_spr = Sprite(targetTextField_tf.parent);
		}
		public function set drawRegions(value:Boolean):void {drawRegions_bool = value;}
		public function set contentColor(value:uint):void {contentColor_uint = value;}
		
		//PARTE EL TEXTO EN SPRITES QUE CONTIENEN SUS CARACTERES.
		public function splitText():Array
		{
			var spriteArray:Array = [];
			
			//REDIBUJA EL CAMPO DE TEXTO PARA IDENTIFICAR CORRIMIENTO Y COMPENSAR PERDIDAS EN SU POSICION.
			var bmpData:BitmapData = new BitmapData(targetTextField_tf.width, targetTextField_tf.height, true, 0x00000000);
			bmpData.draw(targetTextField_tf);
			var fieldRect:Rectangle = bmpData.getColorBoundsRect(0xFFFFFFFF, contentColor_uint, true);
			fieldRect.x += 1;
			fieldRect.y -= 1;
			bmpData.dispose();
			
			//BARRE LOS CARACTERES DEL CAMPO DE TEXTO.
			for(var i:uint; i<targetTextField_tf.text.length; i++)
			{
				//GENERA UN RECTANGULO CON LA UBICACION DEL CARACTER.
				var rect:Rectangle = targetTextField_tf.getCharBoundaries(i);
				
				//POR ALGUNA RAZON "getCharBoundaries" FALLA POR UN PIXEL EN X.
				rect.x -= 1;
				
				//REDIBUJA EL CAMPO DE TEXTO PARA EL SECTOR DEL CARACTER.
				var charBmpData:BitmapData = new BitmapData(rect.width, rect.height, true, 0x00000000);
				var translateMatrix:Matrix = new Matrix();
				translateMatrix.translate(-rect.x, -rect.y);
				charBmpData.draw(targetTextField_tf, translateMatrix);
				
				//REMUEVE ESPACIO VACIO DEL BMPDATA Y COMPENSA EL RECTANGULO.
				var reducedObject:Object = reduceBmpData(charBmpData);
				charBmpData = reducedObject.bmpData;
				rect.x += reducedObject.rect.x;
				rect.y += reducedObject.rect.y;
				rect.width = reducedObject.rect.width;
				rect.height = reducedObject.rect.height;
				
				//AGREGA Y POSICIONA EL GRAFICO EN EL ESCENARIO.
				var charSprite:Sprite = new Sprite();
				var charBmp:Bitmap = new Bitmap(charBmpData);
				charBmp.x -= charBmp.width/2;
				charBmp.y -= charBmp.height/2;
				charSprite.addChild(charBmp);
				charSprite.x = rect.x + targetTextField_tf.x + fieldRect.x;
				charSprite.y = rect.y + targetTextField_tf.y + fieldRect.y;
				parentContainer_spr.addChild(charSprite);
				spriteArray.push(charSprite);
				
				//EN CASO DE QUE SE QUIERA MOSTRAR LAS SECCIONES DE CORTE.
				if(drawRegions_bool)
				{
					charSprite.graphics.lineStyle(1, 0xFF0000, 1);
					charSprite.graphics.drawRect(-charBmp.width/2, -charBmp.height/2, rect.width, rect.height);
				}
			}
			
			//REMUEVE EL CAMPO DE TEXTO (ES SUPLANTADO POR LOS SPRITES).
			parentContainer_spr.removeChild(targetTextField_tf);
			
			//DEVUELVE.
			return spriteArray;
		}
		
		//REMUEVE ESPACIO VACIO DE UN OBJETO BMPDATA.
		private function reduceBmpData(bmpData:BitmapData):Object
		{
			//BUSCA UN RECTANGULO EN EL BMPDATA DONDE HALLA CONTENIDO.
			var rect:Rectangle = bmpData.getColorBoundsRect(0xFFFFFFFF, contentColor_uint, true);
			
			//SI ENCONTRO O NO CONTENIDO.
			if(rect.width)
			{
				//REDIBUJA EL BMPDATA SOLO EN EL SECTOR DONDE ENCONTRO CONTENIDO.
				var translateMatrix:Matrix = new Matrix();
				translateMatrix.translate(-rect.x, -rect.y);
				var reducedBmpData:BitmapData = new BitmapData(rect.width, rect.height, true, 0x00000000);
				reducedBmpData.draw(bmpData, translateMatrix);
				
				//DEVUELVE.
				return {bmpData:reducedBmpData, rect:rect};
			}
			else
			{
				//DEVUELVE.
				return {bmpData:bmpData, rect:rect};
			}
		}
	}
}